/* fcntltest.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h> // 用于 memset 和字符串操作

int main() {
    int file_descriptor;
    char *text1 = "abcdefghi3";
    char *text2 = "0123456789";
    char read_buffer[25];
    memset(read_buffer, '\0', 25);

    // 步骤 1：创建新文件并写入 text1
    file_descriptor = creat("testfile", 0644); // 设置文件权限为 rw-r--r--
    write(file_descriptor, text1, 10);         // 写入 "abcdefghi3" (10 字节)
    close(file_descriptor);

    // 步骤 2：重新以读写模式打开文件
    file_descriptor = open("testfile", O_RDWR);
    read(file_descriptor, read_buffer, 24);    // 读取文件内容
    printf("first read is \"%s\"\n", read_buffer); // 输出: abcdefghi3

    // 步骤 3：重置文件指针到开头
    lseek(file_descriptor, 0, SEEK_SET);

    // 步骤 4：通过 fcntl 设置追加模式
    int flags = fcntl(file_descriptor, F_GETFL); // 获取当前标志
    flags |= O_APPEND;                           // 添加追加标志
    fcntl(file_descriptor, F_SETFL, flags);      // 设置新标志

    // 步骤 5：写入 text2（因追加模式，数据会到文件末尾）
    write(file_descriptor, text2, 10);          // 写入 "0123456789" (10 字节)

    // 步骤 6：再次读取文件内容
    lseek(file_descriptor, 0, SEEK_SET);
    read(file_descriptor, read_buffer, 24);
    printf("second read is \"%s\"\n", read_buffer); // 输出: abcdefghi30123456789

    // 清理
    close(file_descriptor);
    unlink("testfile"); // 删除文件

    return 0;
}
